# coding: utf8
"""
函数和装饰器
"""

"""
函数 - 1
"""


# 定义与调用
def swap(a: int, b: int):
    """数值对调函数"""
    return b, a


a, b = 1, 2
a, b = swap(a, b)
print(a, b)


# 等同于a, b = b, a


# 内部函数
def swap_double(a: int, b: int):
    def _double(_a, _b):
        return _b * 2, _a * 2

    return _double(a, b)


a, b = swap_double(a, b)

"""
函数 - 2
"""


# 函数入参默认值
def default_value(a=1, b=True, c="OK"):
    print(a, b, c)


default_value()  # 什么参数都不填，执行结果：1 True OK

# 必填入参在前，默认值入参在后
# 正确    def func1(param1, param2=2):
# 错误    def func2(param1, param2=2, param3):

# 展开迭代与不确定入参 (*与**操作符)
a, b, c = (0, 1, 2)
print(a, b, c)
a, b, c, *more = range(5)
print(a, b, c)
print(*more, more)  # 打印3 4 [3, 4]

numbers1 = dict(a=0, b=1)
numbers2 = dict(**numbers1, c=2)
# {'a': 0, 'b': 1} {'a': 0, 'b': 1, 'c': 2}
default_value(**numbers2)
print(numbers1, numbers2)

"""
函数 - 装饰器
"""
# 定义和使用
import functools


def progress_bar(func):
    @functools.wraps(func)  # 保持函数在包装内部信息不变
    def wrapper(**kwargs):  # 否则会全部为wrapper
        print(func.__name__, "开始执行")
        # ...修改进度条...
        func(**kwargs)  # 执行被装饰的原函数
        print(func.__name__, "结束执行")


@progress_bar
def flow1(pv1=1, pv2=2):        ...  # 流程方法被包装在装饰器内执行
